package cn.itsource.ymcc.service.impl;

import cn.itsource.result.JSONResult;
import cn.itsource.ymcc.config.AlipayConfig;
import cn.itsource.ymcc.domain.PayOrder;
import cn.itsource.ymcc.dto.AlipayDto;
import cn.itsource.ymcc.mapper.PayOrderMapper;
import cn.itsource.ymcc.service.IAlipayService;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class AlipayServiceImpl implements IAlipayService {

    @Autowired
    private PayOrderMapper payOrderMapper;
    /**
     * 申请支付
     *  前端使用了setInterval 每隔2秒钟访问一次此接口
     *  通过订单编号查询支付单：看支付单是否已经保存完毕
     *      如果支付单已经保存完毕，则立即发请求给支付宝开放平台
     * @param alipayDto
     * @return
     */
    @Override
    public JSONResult apply(AlipayDto alipayDto) {
        try {
            //1、先根据dto里面的订单编号查询 支付订单是否保存成功  订单只有一个  但是查询的方法只有list这个
            List<PayOrder> list = payOrderMapper.selectList(new EntityWrapper<PayOrder>().eq("order_no", alipayDto.getOrderNo()));
            //非空校验
            if(list == null || list.size() == 0){
                return JSONResult.error("订单正在处理中，请稍后。。。。。。。。。。。。。。。。。。");
            }
            //取出订单对象
            PayOrder payOrder = list.get(0);
            //2.订单已经处理完毕，开始申请支付
            // 1. 设置 支付宝接口 参数（全局只需设置一次）
            Factory.setOptions(getOptions());
            // 2. 发起API调用（以创建当面付收款二维码为例）
            AlipayTradePagePayResponse response = Factory.Payment.Page().pay(
                    payOrder.getSubject(), payOrder.getOrderNo(), payOrder.getAmount().toString(), alipayDto.getCallUrl());
            // 3. 处理响应或异常
            if(ResponseChecker.success(response)){
                //response.getBody() 返回的是html字符串，包含一个form表单和一个script 自动提交表单
                return JSONResult.success(response.getBody());
            }else {
                return JSONResult.error("支付失败！原因："+response.getBody());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return JSONResult.error("支付失败！");
        }
    }

    @Autowired
    private AlipayConfig alipayConfig;

    private Config getOptions() {
        Config config = new Config();
        //copy不了属性 原因：阿里的Config类中字段没有提供set方法
        config.protocol = alipayConfig.getProtocol();
        config.gatewayHost = alipayConfig.getGatewayHost();
        config.signType = alipayConfig.getSignType();
        config.appId = alipayConfig.getAppId();
        // 应用私钥：为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        config.merchantPrivateKey = alipayConfig.getMerchantPrivateKey();
        // 支付宝公钥：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        config.alipayPublicKey = alipayConfig.getAlipayPublicKey();
        //可设置异步通知接收服务地址（可选）
        config.notifyUrl = alipayConfig.getNotifyUrl();
        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
        config.encryptKey = alipayConfig.getEncryptKey();
        return config;
    }
}
